package com.kantboot.system.user.dao.repository.entity;

import com.kantboot.system.user.domain.entity.SysUser;
import jakarta.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

public interface SysUserRepository extends JpaRepository<SysUser,Long> {

    /**
     * 判断用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 根据用户名查询密码
     * @param username 用户名
     * @return 密码
     */
    @Query("SELECT password FROM SysUser WHERE username = :username")
    String findPasswordByUsername(String username);

    /**
     * 根据用户名查询用户id
     * @param username 用户名
     * @return 用户id
     */
    @Query("SELECT id FROM SysUser WHERE username = :username")
    Long findIdByUsername(String username);

    /**
     * 判断手机号是否存在
     * @param phone 手机号
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 根据手机号查询用户id
     * @param phone 手机号
     * @return 用户id
     */
    @Query("SELECT id FROM SysUser WHERE phone = :phone")
    Long findIdByPhone(String phone);

    /**
     * 根据手机号查询密码
     * @param phone 手机号
     * @return 密码
     */
    @Query("SELECT password FROM SysUser WHERE phone = :phone")
    String findPasswordByPhone(String phone);

    /**
     * 判断邮箱是否存在
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 根据邮箱查询用户id
     * @param email 邮箱
     * @return 用户id
     */
    @Query("SELECT id FROM SysUser WHERE email = :email")
    Long findIdByEmail(String email);

    /**
     * 根据邮箱查询密码
     * @param email 邮箱
     * @return 密码
     */
    @Query("SELECT password FROM SysUser WHERE email = :email")
    String findPasswordByEmail(String email);

    /**
     * 根据用户id获取密码
     */
    @Query("SELECT password FROM SysUser WHERE id = :id")
    String findPasswordById(Long id);

    /**
     * 根据用户id修改密码
     */
    @Transactional
    @Modifying
    @Query("UPDATE SysUser SET password = :password WHERE id = :id")
    void updatePasswordById(Long id, String password);

}
